﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

class MyExceptionVar
{
public:
	MyExceptionVar()
	{
		cout << "MyExceptionVar的默认构造！" << endl;
	}
	MyExceptionVar(const MyExceptionVar& e)
	{
		cout << "MyExceptionVar的拷贝构造！" << endl;
	}
	~MyExceptionVar()
	{
		cout << "MyExceptionVar的析构调用！" << endl;
	}
	void printError()
	{
		this->m_A = 100;
		cout << "error" << this->m_A << endl;
	}
	int m_A;
};
void doWorkException()
{
	//throw MyExceptionVar();
	//2.下面catch使用指针MyExceptionVar* e时，这里就要throw地址；
	//throw new MyExceptionVar();
	//4.catch使用指针时，也可以throw引用，这样就不用手动调用析构，释放对象；
	MyExceptionVar temp = MyExceptionVar();
	throw& temp;
}
void testExceptionVar()
{
	try
	{
		doWorkException();
	}
	//1.MyExceptionVar e，会多开销一份数据；使用引用可以解决这个问题；
	//catch (MyExceptionVar e)
	//catch (MyExceptionVar& e)
	catch (MyExceptionVar* e)
	{
		e->printError();
		e->printError();
		//5.指向非法内存空间，不应该这么做；
		e->printError();
		cout << "捕获异常！" << endl;
		//3.上面new出来的对象，在堆区，需要手动调用析构；释放对象；
		//delete e;
	}
}

//main311：异常变量的生命周期
int main311()
{
	testExceptionVar();
	/*MyExceptionVar的默认构造！
	MyExceptionVar的拷贝构造！
	捕获异常！
	MyExceptionVar的析构调用！
	MyExceptionVar的析构调用！*/

	//-->

	/*MyExceptionVar的默认构造！
	捕获异常！
	MyExceptionVar的析构调用！*/

	//-->

	/*MyExceptionVar的默认构造！
	捕获异常！
	MyExceptionVar的析构调用！*/

	//-->

	/*MyExceptionVar的默认构造！
	MyExceptionVar的析构调用！
	error100
	error100
	error100
	捕获异常！*/

	system("pause");
	return EXIT_SUCCESS;
}